package net.jeeshop.core.servlet;

import com.alibaba.fastjson.JSONObject;
import net.jeeshop.core.front.SystemManager;
import net.jeeshop.core.oss.OSSObjectSample;
import net.jeeshop.core.util.ImageUtils;
import net.jeeshop.services.front.systemSetting.bean.SystemSetting;
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.Random;

/**
 * jQuery文件上传插件
 *
 * @author Administrator
 */
public class Uploadify extends HttpServlet {
    private static final long serialVersionUID = 1L;
    Logger logger = LoggerFactory.getLogger(this.getClass());
    String dirName = "image";
    //最大文件大小
    long maxSize = 1000000;
    SystemSetting systemSetting = SystemManager.systemSetting;
    /**
     * 实现多文件的同时上传
     */
    public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String saveUrl  = systemSetting.getImageRootPath() +"attached/";
        String savePath = request.getServletContext().getRealPath("/") + "/attached/";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String ymd = sdf.format(new Date());
        savePath += ymd + "/";
        saveUrl += ymd + "/";
        File dirFile = new File(savePath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        //Struts2 请求 包装过滤器
        MultiPartRequestWrapper wrapper = (MultiPartRequestWrapper) request;
        //获得上传的文件名
        //获得文件过滤器
        File file = wrapper.getFiles("imgFile")[0];
        String fileName = wrapper.getFileNames("imgFile")[0];//imgFile,imgFile,imgFile
        Map<String,String>  extMap = systemSetting.getExtMap();
        //检查扩展名
        String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        if (!Arrays.asList(extMap.get(dirName).split(",")).contains(fileExt)) {
            // out.println(getError("上传文件扩展名是不允许的扩展名。\n只允许" + extMap.get(dirName) + "格式。"));
            return;
        }
        //检查文件大小
        if (file.length() > maxSize) {
            // out.println(getError("上传文件大小超过限制。"));
            return;
        }


        //    //重构上传图片的名称
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
        String newImgName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + fileExt;
        byte[] buffer = new byte[1024];
        //获取文件输出流
        //获取内存中当前文件输入流
        try (FileOutputStream fos = new FileOutputStream(savePath + "/" + newImgName);
             InputStream in = new FileInputStream(file)) {
            int num = 0;
            while ((num = in.read(buffer)) > 0) {
                fos.write(buffer, 0, num);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }

        /////////////////////////////////////////////////////////////////////////////////////////////
        if (file.isFile()) {
            String newFileName1 = null;//小图
            String newFileName2 = null;//中图
            String newFileName3 = null;//大图 ，也是原图
            synchronized(OSSObjectSample.lock){
                String newFileName0 = String.valueOf(System.currentTimeMillis());
                logger.error("newFileName0="+newFileName0);
                newFileName1 = newFileName0 + "_1";
                newFileName2 = newFileName0 + "_2";
                newFileName3 = newFileName0 + "_3." + fileExt;
            }
            logger.error("newFileName1="+newFileName1+",newFileName2="+newFileName2+",newFileName3="+newFileName3);
            String rootPath = "attached/"+dirName+ "/"+ df.format(new Date()) + "/";//云存储目录前缀

            File uploadedFile3 = new File(savePath, newImgName);
            try{

                File uploadedFile1 = new File(savePath, newFileName1+"."+fileExt);
                File uploadedFile2 = new File(savePath, newFileName2+"."+fileExt);

                ImageUtils.ratioZoom2(uploadedFile3, uploadedFile1, Double.valueOf(SystemManager.getInstance().get("product_image_1_w")));
                ImageUtils.ratioZoom2(uploadedFile3,uploadedFile2,Double.valueOf(SystemManager.getInstance().get("product_image_2_w")));

                OSSObjectSample.save(rootPath + newFileName1+"."+fileExt, uploadedFile1);
                OSSObjectSample.save(rootPath + newFileName2+"."+fileExt, uploadedFile2);
                OSSObjectSample.save(rootPath + newFileName3, uploadedFile3);
            }catch(Exception e){
                e.printStackTrace();
                logger.error("上传文件异常："+e.getMessage());
                response.getWriter().write("上传文件失败。");
                return;
            }

            JSONObject obj = new JSONObject();
            obj.put("error", 0);
            obj.put("url", saveUrl + newFileName3);
            response.getWriter().write(obj.toJSONString());
        }
        response.getWriter().write("1");
    }

    public void doPost (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
